﻿using System;
using System.Collections.Generic;
using System.Text;
using Vnoss.Language.French.Models;

namespace Vnoss.Language.French.DAL
{
    /// <summary>
    /// Accès aux données pour la conjugaison.
    /// </summary>
    public interface IConjugationDAO
    {
        /// <summary>
        /// Recherche l'origine, cad la partie unchangée du verbe, pour la conjugaison
        /// </summary>
        /// <param name="infinitive">Le verbe en infinitif</param>
        /// <returns>La partie fixe du verbe</returns>
        string FindOrigin(string infinitive);
        /// <summary>
        /// Recherche tous les verbes commencés par le préfix
        /// </summary>
        /// <param name="prefix">Préfix</param>
        /// <param name="maxResult">Nombre maximum des résultats</param>
        /// <remarks>Si le préfix est rien, retourner la liste de tous le verbes dans la base</remarks>
        /// <returns>Liste des verbes sous forme de chaîne de caratères satifaisant</returns>
        List<string> FindVerbs(string prefix, int maxResult);
        /// <summary>
        /// Recherche le terminaison du verbe, dans son mode et temps donné
        /// </summary>
        /// <param name="infinitive">L'infinitif du verbe</param>
        /// <param name="mood">Mode</param>
        /// <param name="tense">Temps</param>
        /// <returns>List des terminaisons du verbe dans ce temps et ce mode</returns>
        List<List<string>> FindTerminal(string infinitive, Mood mood, Tense tense);

        /// <summary>
        /// Compter nombre des verbes dans la base
        /// </summary>
        /// <returns>Nombre des verbes dans la base</returns>
        int CountVerb();

        /// <summary>
        /// Compter le nombre des verbes commencés par le préfix
        /// </summary>
        /// <param name="prefix">le préfix du verb</param>
        /// <returns>Nombre des verbes commencés par le préfix</returns>
        /// <remarks>Pour la raison de performance, cette méthode est conseillée pour compter le nombre de verbes, si la liste des verbes n'est pas important. <br />Si le préfix est rien, retourner le nombre total des verbes dans la base</remarks>
        int CountVerb(string prefix);

        /// <summary>
        /// Indiquer si le verbe est commencé par un H muet. Utile pour la mise en forme.
        /// </summary>
        /// <param name="infinitive">verbe infinitif</param>
        /// <returns></returns>
        bool IsMuteH(string infinitive);

        /// <summary>
        /// Rercherche le groupe du verbe
        /// </summary>
        /// <param name="infinitive">l'infinitif du verbe</param>
        /// <returns>Group du verbe</returns>
        Group FindGroup(string infinitive);

        /// <summary>
        /// Recherche l'auxiliaire du verbe, pour le temps et mode composé
        /// </summary>
        /// <param name="infinitive">l'infinitif du verbe</param>
        /// <remarks>L'auxiliaire peut avoir la valeur "avoir", "être" ou les deux</remarks>
        /// <returns>liste des auxiliaires</returns>
        IList<string> FindAuxiliary(string infinitive);

        /// <summary>
        /// Teste si le verbe existe dans la base
        /// </summary>
        /// <param name="infinitive">l'infinitif du verbe</param>
        /// <returns></returns>
        bool HasVerb(string infinitive);
       

    }
}
